﻿using System;
using Microsoft.Extensions.Logging;

namespace Communication.StreamResource;

public interface IStreamResource : IDisposable, IFormattable
{
    /// <summary>
    ///     指示不发生超时。
    /// </summary>
    int InfiniteTimeout { get; }

    /// <summary>
    ///     日志接口
    /// </summary>
    ILogger Logger { get; }

    /// <summary>
    ///     获取一个值，该值指示  对象的打开或关闭状态。
    /// </summary>
    bool Connected { get; }

    /// <summary>
    ///     获取或设置读取操作未完成时发生超时前的毫秒数。默认超时时间400ms。
    /// </summary>
    int ReadTimeout { get; set; }

    /// <summary>
    ///     获取或设置写操作未完成时发生超时前的毫秒数。默认超时时间400ms。
    /// </summary>
    int WriteTimeout { get; set; }

    /// <summary>
    ///     清除接收缓冲区。
    /// </summary>
    void DiscardInBuffer();

    /// <summary>
    ///     从输入缓冲区读取一定数量的字节，并在指定的偏移量处将这些字节写入字节数组。
    /// </summary>
    /// <param name="buffer"> 要写入的字节数组。</param>
    /// <param name="offset"> 缓冲区数组中开始写入的偏移量。</param>
    /// <param name="count"> 要读取的字节数。</param>
    /// <returns>读取的字节数。</returns>
    int Read(byte[] buffer, int offset, int count);

    public int Read(byte[] buffer)
    {
        return Read(buffer, 0, buffer.Length);
    }


    /// <summary>
    ///     从指定的偏移量开始，从输出缓冲区向端口写入指定数量的字节。
    /// </summary>
    /// <param name="buffer"></param>
    /// <param name="offset">从指定的偏移量开始，从输出缓冲区向端口写入指定数量的字节。包含要写入端口的数据的字节数组。</param>
    /// <param name="count">要写入的字节数。</param>
    void Write(byte[] buffer, int offset, int count);


    /// <summary>
    ///     重置对象状态
    /// </summary>
    /// <returns></returns>
    bool Reset();

    void Close();
}